home *** CD-ROM | disk | FTP | other *** search
/ Meeting Pearls 2 / Meeting Pearls Vol. II (1995)(GTI - Schatztruhe)[!].iso / Pearls / comm / EazyBBS / contrib / EazyLog_17.lha / EazyLog_V1.7 / Src / EazyLog.c next >
C/C++ Source or Header  |  1994-08-14  |  55KB  |  1,833 lines

  1. /********************************************************************
  2.  *                                                                  *
  3.  * EazyLog C Version (c) 1994 by Thomas Patschinski                 *
  4.  *                                                                  *
  5.  ********************************************************************/
  6.  
  7. #include <exec/types.h>
  8. #include <exec/lists.h>
  9. #include <exec/memory.h>
  10. #include <dos/dos.h>
  11. #include <dos/rdargs.h>
  12. #include <dos/datetime.h>
  13. #include <proto/exec.h>
  14. #include <proto/dos.h>
  15. #include <stdio.h>
  16. #include <string.h>
  17. #include <ctype.h>
  18. #include <stdlib.h>
  19. #include <error.h>
  20. #include <own/pools.h>
  21.  
  22. #define DEF_days_ago        5
  23. #define DEF_ports        (1L<<0)
  24. #define DEF_top_files        10
  25. #define DEF_top_boards        5
  26. #define DEF_top_area_stat    99
  27. #define DEF_top_user_stat    99
  28. #define DEF_buffer_size        4096
  29.  
  30. #define outgoing        "Outgoing"
  31. #define config_file        "PROGDIR:EazyLog.Config"
  32. #define max_line_length        256
  33.  
  34. #define start_date        1       /* von 1 an */
  35. #define start_time        10      /*  "  " "  */
  36. #define start_port        21      /*  "  " "  */
  37. #define start_type        25      /*  "  " "  */
  38. #define start_user        29      /* von 0 an */
  39.  
  40. #define raw_version        "1.7"
  41. #define raw_date        "14.8.94"
  42.  
  43. #define TEMPL_MAXIMUM        8
  44. #define TEMPL_questionmark    0
  45. #define TEMPL_config        1
  46. #define TEMPL_log        2
  47. #define TEMPL_buffer        3
  48. #define TEMPL_files        4
  49. #define TEMPL_boards        5
  50. #define TEMPL_area_stat        6
  51. #define TEMPL_user_stat        7
  52.  
  53. static char *version_dos        = "\0$VER: EazyLog "raw_version" ("raw_date")";
  54. static char *version            = "EazyLog V" raw_version " © 1994 by Thomas Patschinski Compiled: "__DATE__" "__TIME__"";
  55.  
  56. static char *template            = "?/S,C=Config/K,L=Log/K,Buffer/K/N,F=Files/S,B=Boards/S,AreaStat/K,U=UserStat/K";
  57.  
  58. static char *DEF_log_name        = "mb:EazyBBS.TransferLog";
  59. static char *DEF_header_name_files    = "";
  60. static char *DEF_header_name_boards    = "";
  61. static char *DEF_header_name_stat_area    = "";
  62. static char *DEF_header_name_user_stat    = "";
  63. static char *DEF_file_intro_1st        = "\\9\\1";
  64. static char *DEF_file_intro_next    = "\\7";
  65. static char *DEF_board_intro_1st    = "\\9\\1";
  66. static char *DEF_board_intro_next    = "\\7";
  67. static char *DEF_area_stat_intro_1st    = "\\9\\1";
  68. static char *DEF_area_stat_intro_next    = "\\7";
  69. static char *DEF_forbidden_text        = "\n\\1Sorry you are not allowed to use this Userprogramm.\n";
  70.  
  71. static char *CFG_days_ago        = "DAYSAGO";
  72. static char *CFG_ports            = "PORTS";
  73. static char *CFG_hidden_area        = "HIDDENAREA";
  74. static char *CFG_hidden_board        = "HIDDENBOARD";
  75. static char *CFG_log_name        = "LOGNAME";
  76. static char *CFG_top_files        = "TOPFILES";
  77. static char *CFG_top_boards        = "TOPBOARDS";
  78. static char *CFG_top_area_stat        = "TOPAREASTAT";
  79. static char *CFG_top_user_stat        = "TOPUSERSTAT";
  80. static char *CFG_file_intro_1st        = "FILEINTRO1ST";
  81. static char *CFG_file_intro_next    = "FILEINTRONEXT";
  82. static char *CFG_board_intro_1st    = "BOARDINTRO1ST";
  83. static char *CFG_board_intro_next    = "BOARDINTRONEXT";
  84. static char *CFG_area_stat_intro_1st    = "AREASTATINTRO1ST";
  85. static char *CFG_area_stat_intro_next    = "AREASTATINTRONEXT";
  86. static char *CFG_header_top_files    = "FILEHEADER";
  87. static char *CFG_header_top_boards    = "BOARDHEADER";
  88. static char *CFG_header_area_stat    = "AREASTATHEADER";
  89. static char *CFG_header_user_stat    = "USERSTATHEADER";
  90. static char *CFG_footer_top_files    = "FILEFOOTER";
  91. static char *CFG_footer_top_boards    = "BOARDFOOTER";
  92. static char *CFG_show_file_header    = "SHOWFILEHEADER";
  93. static char *CFG_show_file_footer    = "SHOWFILEFOOTER";
  94. static char *CFG_show_board_header    = "SHOWBOARDHEADER";
  95. static char *CFG_show_board_footer    = "SHOWBOARDFOOTER";
  96. static char *CFG_show_area_stat_header    = "SHOWAREASTATHEADER";
  97. static char *CFG_show_user_stat_header    = "SHOWUSERSTATHEADER";
  98. static char *CFG_allowed_user        = "ALLOWEDUSER";
  99. static char *CFG_forbidden_user        = "FORBIDDENUSER";
  100. static char *CFG_forbidden_text        = "FORBIDDENTEXT";
  101. static char *CFG_sort_user_stat        = "SORTUSERSTAT";
  102.  
  103. static char *CFG_ja            = "JA";
  104. static char *CFG_yes            = "YES";
  105. static char *CFG_nein            = "NEIN";
  106. static char *CFG_no            = "NO";
  107.  
  108.  
  109. #define HT_Files        0
  110. #define HT_Boards        1
  111. #define HT_AreaStat        2
  112. #define HT_UserStat        3
  113.  
  114. /* Komplette Zeilen Info */
  115.  
  116. #define LF_Unbekannt        0
  117. #define LF_Upl            1
  118. #define LF_Dwn            2
  119. #define LF_Msg            3
  120. #define LF_Txt            4
  121. #define LF_Bin            5
  122.  
  123. struct LineFormat {
  124.    struct Node        node;
  125.    struct DateStamp    Datum;
  126.    int            PortNr;
  127.    int            Action;
  128.    int            Laenge;
  129.    int            Dauer;
  130.    int            Cps;
  131.    char            User[16];
  132.    char            AnUser[128];
  133.    char            Name1[64];
  134.    char            Name2[64];
  135. };
  136.  
  137. /* Uni Top Liste (für FindNextRankItem) */
  138.  
  139. struct UniInfo {
  140.    struct Node        node;
  141.    int            Anzahl;
  142. };
  143.  
  144. /* Top Board - List Daten */
  145.  
  146. struct BoardInfo {
  147.    struct Node        node;
  148.    int            Anzahl;
  149.    struct LineFormat    *Data;
  150. };
  151.  
  152. /* Top File - List Daten */
  153.  
  154. struct DownloadInfo {
  155.    struct Node        node;
  156.    int            Anzahl;
  157.    struct LineFormat    *Uploader;
  158.    struct LineFormat    *FirstDown;
  159. };
  160.  
  161. /* UniStat Liste */
  162.  
  163. struct UniStatInfo {
  164.    struct Node        node;
  165.    int            Anzahl;
  166. };
  167.  
  168. /* Area Stat - List Daten */
  169.  
  170. struct AreaStatInfo {
  171.    struct Node        node;
  172.    int            Anzahl;
  173.    int            GesLaenge;
  174.    char            User[16];
  175. };
  176.  
  177. /* User Stat - List Daten */
  178.  
  179. struct UserStatInfo {
  180.    struct Node        node;
  181.    int            GesLaenge;
  182.    int            dummy;
  183.    char            File[64];
  184.    struct DateStamp    Datum;
  185. };
  186.  
  187. /* Hidden Board/Area Allowed/Forbidden User Daten */
  188.  
  189. struct HiddenData {
  190.    struct Node        node;
  191.    char            String[32];
  192. };
  193.  
  194. /* Config Daten */
  195.  
  196. struct Config {
  197.    int            DaysAgo;
  198.    int            Ports;
  199.    short        TopFiles;
  200.    short        TopBoards;
  201.    short        TopAreaStat;
  202.    short        TopUserStat;
  203.    BOOL            ShowFileHeader;
  204.    BOOL            ShowFileFooter;
  205.    BOOL            ShowBoardHeader;
  206.    BOOL            ShowBoardFooter;
  207.    BOOL            ShowAreaStatHeader;
  208.    BOOL            ShowUserStatHeader;
  209.    BOOL            SortUserStat;
  210.    struct List        HiddenAreas;
  211.    struct List        HiddenBoards;
  212.    struct List        *AllowedUser;
  213.    struct List        *ForbiddenUser;
  214.    char            LogName[64];
  215.    char            HeaderTopFiles[64];
  216.    char            HeaderTopBoards[64];
  217.    char            HeaderAreaStat[64];
  218.    char            HeaderUserStat[64];
  219.    char            FooterTopFiles[64];
  220.    char            FooterTopBoards[64];
  221.    char            FileIntro1st[16];
  222.    char            FileIntroNext[16];
  223.    char            BoardIntro1st[16];
  224.    char            BoardIntroNext[16];
  225.    char            OutLogName[64];
  226.    char            ForbiddenText[256];
  227.    char            AreaStatIntro1st[16];
  228.    char            AreaStatIntroNext[16];
  229. };
  230.  
  231. /* Prototypes */
  232.  
  233. static void Cleanup(void);
  234. static BOOL InitAll(void);
  235. static void AktDate(char *DateStr, char *TimeStr);
  236. static void WriteLogFile(char *LogName, char *ConfigName, int File, int Board, char *Area, char *UserStat,BOOL Access);
  237. static int  ReadWord(char *Buffer,char *Word,int Start);
  238. static __stdargs char *ReadConfigFile(char *CfgName, int BuffSize);
  239. static BOOL InList(char *Pfad, struct List *List);
  240. static struct DownloadInfo *FileInList(char *File);
  241. static struct BoardInfo *BoardInList(char *Board1, char *Board2);
  242. static struct AreaStatInfo *UserInList(char *User, struct List *Liste);
  243. static void CodeDate(char *Datum, char *Time, struct DateStamp *Date);
  244. static void DecodeDate(char *Datum, char *Time, struct DateStamp *DecodeDate);
  245. static char *CopyPart(char *Zeile,char *Buffer,char EndZeichen1,char EndZeichen2);
  246. static struct LineFormat *Decode1Line(char *Zeile);
  247. static BOOL ScanLogFile(char *Name, int BuffSize);
  248. static void WriteDefFilesHeader(char *DateStr, char *TimeStr);
  249. static void WriteDefBoardsHeader(char *DateStr, char *TimeStr);
  250. static void WriteDefAreaStatHeader(char *DateStr, char *TimeStr);
  251. static void WriteHeader(char *HeaderName, int WhichHeader, char *StatName);
  252. static void WriteDefFooter(int Anzahl);
  253. static void WriteFooter(char *FooterName, int GesRanks, int ShownRanks, int Gesamt, int Shown);
  254. static APTR GetNextRankItem(int Nummer, struct List *Liste);
  255. static void MakeTopFileListe(int *Anzahl1, int *Anzahl2);
  256. static void SortTopFiles(void);
  257. static void ShowTopFiles(int *Anzahl1, int *Anzahl2);
  258. static void MakeTopBoardListe(int *Anzahl1, int *Anzahl2);
  259. static void SortTopBoards(void);
  260. static void ShowTopBoards(int *Anzahl1, int *Anzahl2);
  261. static void MakeAreaStatListe(char * AreaName);
  262. static void SortUniStat(struct List *Liste);
  263. static void ShowAreaStat(void);
  264. static void MakeUserStatListe(char *UserName);
  265. static void ShowUserStat(void);
  266. static void WriteInt(int Zahl, int Stellen);
  267. static void WriteIntTausend(int Zahl, int Stellen);
  268. static BOOL CheckAllowed(void);
  269.  
  270. /* Globale Variablen */
  271.  
  272. static struct List        LineList;
  273. static struct List        TopFiles;
  274. static struct List        TopBoards;
  275. static struct List        TempListe;
  276. static struct List        AreaUpListe;
  277. static struct List        AreaDownListe;
  278. static struct List        UserUpListe;
  279. static struct List        UserDownListe;
  280. static struct Config        Cfg;
  281. static struct RDArgs        *rda;
  282. static LONG            ResArray[TEMPL_MAXIMUM];
  283. static char            *CharPtr;
  284. static int            Count1,Count2,Count3,Count4;
  285. static int            VBuffer=DEF_buffer_size;
  286. static void            *PoolHeader=NULL;
  287. static char            *CName;
  288.  
  289. #ifdef __SASC
  290. __regargs int _CXBRK(void) { return(0); }      /* Disable Lattice CTRL/C handling *
  291. __regargs int __chkabort(void) { return(0); }  /* really */
  292. #endif
  293.  
  294. int main(void)
  295. {
  296.    if (rda=ReadArgs(template,&ResArray[0],NULL)) {
  297.       if (ResArray[TEMPL_questionmark]) {
  298.          puts(version); puts(template);
  299.       }
  300.       else {
  301.  
  302.          if (InitAll()) {
  303.  
  304.             if (ResArray[TEMPL_buffer])
  305.                VBuffer=* (int *) ResArray[TEMPL_buffer];
  306.  
  307.             /*******************/
  308.             /* Config einlesen */
  309.             /*******************/
  310.  
  311.             if (ResArray[TEMPL_config]) {
  312.                CName=ReadConfigFile( (char *) ResArray[TEMPL_config],VBuffer);
  313.             }
  314.             else {
  315.                CName=ReadConfigFile(config_file,VBuffer);
  316.             }
  317.  
  318.             if (ResArray[TEMPL_log])
  319.                WriteLogFile( (char *) ResArray[TEMPL_log], CName,ResArray[TEMPL_files],
  320.                              ResArray[TEMPL_boards],(char *) ResArray[TEMPL_area_stat],
  321.                              (char *) ResArray[TEMPL_user_stat],CheckAllowed());
  322.  
  323.             if (CheckAllowed()) {
  324.  
  325.                /********************/
  326.                /* Logfiles Scannen */
  327.                /********************/
  328.  
  329.                if ((ResArray[TEMPL_files]) || (ResArray[TEMPL_boards]) ||
  330.                    (ResArray[TEMPL_area_stat]) || (ResArray[TEMPL_user_stat])) {
  331.                   if (ScanLogFile(&Cfg.LogName,VBuffer)) {
  332.  
  333.                      if (ResArray[TEMPL_area_stat]) {
  334.  
  335.                         /*************/
  336.                         /* Area Stat */
  337.                         /*************/
  338.  
  339.                         MakeAreaStatListe( (char *) ResArray[TEMPL_area_stat]);
  340.                         SortUniStat(&AreaUpListe);
  341.                         SortUniStat(&AreaDownListe);
  342.                         if (Cfg.ShowAreaStatHeader)
  343.                            WriteHeader(&Cfg.HeaderAreaStat,HT_AreaStat,(char *) ResArray[TEMPL_area_stat]);
  344.                         ShowAreaStat();
  345.  
  346.                      }
  347.  
  348.                      if (ResArray[TEMPL_user_stat]) {
  349.  
  350.                         /*************/
  351.                         /* User Stat */
  352.                         /*************/
  353.  
  354.                         MakeUserStatListe( (char *) ResArray[TEMPL_user_stat]);
  355.                         if (Cfg.ShowUserStatHeader)
  356.                            WriteHeader(&Cfg.HeaderUserStat,HT_UserStat,(char *) ResArray[TEMPL_user_stat]);
  357.                         if (Cfg.SortUserStat) {
  358.                            SortUniStat(&UserUpListe);
  359.                            SortUniStat(&UserDownListe);
  360.                         }
  361.                         ShowUserStat();
  362.  
  363.                      }
  364.  
  365.                      if (ResArray[TEMPL_files]) {
  366.  
  367.                         /*************/
  368.                         /* Top Files */
  369.                         /*************/
  370.  
  371.                         MakeTopFileListe(&Count3,&Count4);
  372.                         SortTopFiles();
  373.                         if (Cfg.ShowFileHeader)
  374.                            WriteHeader(&Cfg.HeaderTopFiles,HT_Files,NULL);
  375.                         ShowTopFiles(&Count1,&Count2);
  376.                         if (Cfg.ShowFileFooter)
  377.                            WriteFooter(&Cfg.FooterTopFiles,Count1,Count2,Count3,Count4);
  378.                      }
  379.  
  380.                      if (ResArray[TEMPL_boards]) {
  381.  
  382.                         /**************/
  383.                         /* Top Boards */
  384.                         /**************/
  385.  
  386.                         MakeTopBoardListe(&Count3,&Count4);
  387.                         SortTopBoards();
  388.                         if (Cfg.ShowBoardHeader)
  389.                            WriteHeader(&Cfg.HeaderTopBoards,HT_Boards,NULL);
  390.                         ShowTopBoards(&Count1,&Count2);
  391.                         if (Cfg.ShowBoardFooter)
  392.                            WriteFooter(&Cfg.FooterTopBoards,Count1,Count2,Count3,Count4);
  393.                      }
  394.                   }
  395.                   else {
  396.                      printf("Can't open %s\n",&Cfg.LogName);
  397.                   }
  398.                }
  399.             }
  400.             else {
  401.                printf(&Cfg.ForbiddenText);
  402.             }
  403.          }
  404.       }
  405.       FreeArgs(rda);     
  406.    }
  407.    else {
  408.       puts(version); puts(template);
  409.    }
  410.    Cleanup();
  411.    return 0;
  412. }
  413.  
  414. /* Tool Proceduren */
  415.  
  416. static void Cleanup(void)
  417. {
  418.    DeletePool(PoolHeader);
  419. }
  420.  
  421. static BOOL InitAll(void)
  422. {
  423.    /* Pool erstellen */
  424.  
  425.    if (!(PoolHeader=CreatePool(MEMF_PUBLIC|MEMF_CLEAR,32768,16384)))
  426.       return FALSE;
  427.  
  428.    NewList(&Cfg.HiddenAreas);
  429.    NewList(&Cfg.HiddenBoards);
  430.    NewList(&LineList);
  431.    NewList(&TopFiles);
  432.    NewList(&TopBoards);
  433.    NewList(&AreaUpListe);
  434.    NewList(&AreaDownListe);
  435.    NewList(&UserUpListe);
  436.    NewList(&UserDownListe);
  437.  
  438.    return TRUE;
  439. }
  440.  
  441. static void AktDate(char *DateStr, char *TimeStr)
  442. {
  443.    struct DateStamp    date;
  444.    struct DateTime    DatumStr;
  445.  
  446.    DateStamp(&date);
  447.  
  448.    DatumStr.dat_Stamp    = date;
  449.    DatumStr.dat_Format    = FORMAT_CDN;
  450.    DatumStr.dat_Flags    = 0;
  451.    DatumStr.dat_StrDay    = NULL;
  452.    DatumStr.dat_StrDate    = DateStr;
  453.    DatumStr.dat_StrTime    = TimeStr;
  454.  
  455.    DateToStr(&DatumStr);
  456. }
  457.  
  458. static void WriteLogFile(char *LogName, char *ConfigName, int File, int Board, char *Area, char *UserStat,BOOL Access)
  459. {
  460.    BPTR            F;
  461.    char            User[16];
  462.    char            Date[16],Time[16];
  463.  
  464.    if (F = Open(LogName,MODE_READWRITE)) {
  465.       if (GetVar("EazyUsername",&User,15,0)==-1)
  466.          strcpy(&User,"<local>");
  467.  
  468.       Seek(F,0,OFFSET_END);
  469.  
  470.       AktDate(&Date,&Time);
  471.       FPuts(F,&Date);
  472.       FPutC(F,' ');
  473.       FPuts(F,&Time);
  474.       FPuts(F,", ");
  475.       FPuts(F,&User);
  476.       FPuts(F,", ");
  477.       if (File)
  478.          FPuts(F,"Files, ");
  479.       if (Board)
  480.          FPuts(F,"Boards, ");
  481.       if (Area) {
  482.          FPuts(F,Area);
  483.          FPuts(F,", ");
  484.       }
  485.       if (UserStat)
  486.          FPuts(F,"UserStat, ");
  487.       if (ConfigName) {
  488.          FPuts(F,ConfigName);
  489.       }
  490.       else {
  491.          FPuts(F,"<Interne Config>");
  492.       }
  493.       if (!Access)
  494.          FPuts(F,", *NO ACCESS* ");
  495.       FPutC(F,'\n');
  496.         
  497.       Close(F);
  498.    }
  499.  
  500. }
  501.  
  502. static int ReadWord(char *Buffer,char *Word,int Start)
  503. {
  504.    int        i;
  505.    BOOL        Flag=FALSE;
  506.  
  507.    Buffer += Start;
  508.    i=Start;
  509.  
  510.    while ((*Buffer==' ') || (*Buffer=='\t') || (*Buffer==',')) {
  511.       Buffer++;
  512.       i++;
  513.    }
  514.  
  515.    while (*Buffer!='\012') {
  516.       if ( !Flag && ((*Buffer==' ') || (*Buffer==',') || (*Buffer=='\t')) ) break;
  517.  
  518.       if (*Buffer=='\"') {
  519.          Flag = !Flag;
  520.       }
  521.       else {
  522.          if ( Flag && (*Buffer=='\\') ) {
  523.             Buffer++;
  524.             if ((*Buffer=='n') || (*Buffer=='N') ) {
  525.                *Word='\n';
  526.             }
  527.             else {
  528.                *Word=*Buffer;
  529.             }
  530.             Word++;
  531.          }
  532.          else {
  533.             *Word=*Buffer;
  534.             Word++;
  535.          }
  536.       }
  537.       Buffer++;
  538.       i++;
  539.    }
  540.    *Word='\0';
  541.    if (*Buffer=='\012') return -1;
  542.    return i;
  543.  
  544. }
  545.  
  546. static __stdargs char *ReadConfigFile(char *CfgName, int BuffSize)
  547. {
  548.    volatile char    *RetCfg=NULL;
  549.    BPTR            F;
  550.    char            Buffer[max_line_length];
  551.    char            Word[64];
  552.    int            Pos,Wert;
  553.    struct HiddenData    *Data;
  554.  
  555.    Cfg.AllowedUser        = NULL;
  556.    Cfg.ForbiddenUser        = NULL;
  557.    Cfg.ShowFileHeader        = TRUE;
  558.    Cfg.ShowFileFooter        = FALSE;
  559.    Cfg.ShowBoardHeader        = TRUE;
  560.    Cfg.ShowBoardFooter        = FALSE;
  561.    Cfg.ShowAreaStatHeader    = TRUE;
  562.    Cfg.ShowUserStatHeader    = TRUE;
  563.    Cfg.SortUserStat        = TRUE;
  564.    Cfg.DaysAgo            = DEF_days_ago;
  565.    Cfg.Ports            = DEF_ports;
  566.    Cfg.TopFiles            = DEF_top_files;
  567.    Cfg.TopBoards        = DEF_top_boards;
  568.    Cfg.TopAreaStat        = DEF_top_area_stat;
  569.    Cfg.TopUserStat        = DEF_top_user_stat;
  570.    strcpy(&Cfg.OutLogName,"");
  571.    strcpy(&Cfg.FileIntro1st,DEF_file_intro_1st);
  572.    strcpy(&Cfg.FileIntroNext,DEF_file_intro_next);
  573.    strcpy(&Cfg.BoardIntro1st,DEF_board_intro_1st);
  574.    strcpy(&Cfg.BoardIntroNext,DEF_board_intro_next);
  575.    strcpy(&Cfg.HeaderTopFiles,DEF_header_name_files);
  576.    strcpy(&Cfg.HeaderTopBoards,DEF_header_name_boards);
  577.    strcpy(&Cfg.HeaderAreaStat,DEF_header_name_stat_area);
  578.    strcpy(&Cfg.HeaderUserStat,DEF_header_name_user_stat);
  579.    strcpy(&Cfg.AreaStatIntro1st,DEF_area_stat_intro_1st);
  580.    strcpy(&Cfg.AreaStatIntroNext,DEF_area_stat_intro_next);
  581.    strcpy(&Cfg.LogName,DEF_log_name);
  582.    strcpy(&Cfg.ForbiddenText,DEF_forbidden_text);
  583.  
  584.    if (F=Open(CfgName,MODE_OLDFILE)) {
  585.       RetCfg=CfgName;
  586.       SetVBuf(F,NULL,0,BuffSize);
  587.  
  588.       while (FGets(F,&Buffer,max_line_length-1)) {
  589.          errno=0;
  590.          Pos=ReadWord(&Buffer,&Word,0);
  591.  
  592.          if (Pos!=-1) {
  593.             if (Word[0]!='#') {
  594.                if (!stricmp(&Word,CFG_days_ago)) {
  595.                   ReadWord(&Buffer,&Word,Pos);
  596.                   Wert=strtol(&Word,NULL,10);
  597.                   if ( (errno!=ERANGE) && (Wert>0) )
  598.                      Cfg.DaysAgo=Wert;
  599.                }
  600.  
  601.                if (!stricmp(&Word,CFG_ports)) {
  602.                   Cfg.Ports=0;
  603.                   do {
  604.                      Pos=ReadWord(&Buffer,&Word,Pos);
  605.                      Wert=strtol(&Word,NULL,10);
  606.                      if ( (errno!=ERANGE) && (Wert>0) )
  607.                         Cfg.Ports |= Wert;
  608.                   } while (Pos!=-1);
  609.                }
  610.  
  611.                if (!stricmp(&Word,CFG_top_files)) {
  612.                   ReadWord(&Buffer,&Word,Pos);
  613.                   Wert=strtol(&Word,NULL,10);
  614.                   if ( (errno!=ERANGE) && (Wert>0) )
  615.                      Cfg.TopFiles=Wert;
  616.                }
  617.  
  618.                if (!stricmp(&Word,CFG_top_boards)) {
  619.                   ReadWord(&Buffer,&Word,Pos);
  620.                   Wert=strtol(&Word,NULL,10);
  621.                   if ( (errno!=ERANGE) && (Wert>0) )
  622.                      Cfg.TopBoards=Wert;
  623.                }
  624.  
  625.                if (!stricmp(&Word,CFG_top_area_stat)) {
  626.                   ReadWord(&Buffer,&Word,Pos);
  627.                   Wert=strtol(&Word,NULL,10);
  628.                   if ( (errno!=ERANGE) && (Wert>0) )
  629.                      Cfg.TopAreaStat=Wert;
  630.                }
  631.  
  632.                if (!stricmp(&Word,CFG_top_user_stat)) {
  633.                   ReadWord(&Buffer,&Word,Pos);
  634.                   Wert=strtol(&Word,NULL,10);
  635.                   if ( (errno!=ERANGE) && (Wert>0) )
  636.                      Cfg.TopUserStat=Wert;
  637.                }
  638.  
  639.                if (!stricmp(&Word,CFG_log_name)) {
  640.                   ReadWord(&Buffer,&Word,Pos);
  641.                   if (strlen(&Word))
  642.                      strcpy(&Cfg.LogName,&Word);
  643.                }
  644.  
  645.                if (!stricmp(&Word,CFG_file_intro_1st)) {
  646.                   ReadWord(&Buffer,&Word,Pos);
  647.                   if (strlen(&Word))
  648.                      strcpy(&Cfg.FileIntro1st,&Word);
  649.                }
  650.  
  651.                if (!stricmp(&Word,CFG_file_intro_next)) {
  652.                   ReadWord(&Buffer,&Word,Pos);
  653.                   if (strlen(&Word))
  654.                      strcpy(&Cfg.FileIntroNext,&Word);
  655.                }
  656.  
  657.                if (!stricmp(&Word,CFG_board_intro_1st)) {
  658.                   ReadWord(&Buffer,&Word,Pos);
  659.                   if (strlen(&Word))
  660.                      strcpy(&Cfg.BoardIntro1st,&Word);
  661.                }
  662.  
  663.                if (!stricmp(&Word,CFG_board_intro_next)) {
  664.                   ReadWord(&Buffer,&Word,Pos);
  665.                   if (strlen(&Word))
  666.                      strcpy(&Cfg.BoardIntroNext,&Word);
  667.                }
  668.  
  669.                if (!stricmp(&Word,CFG_area_stat_intro_1st)) {
  670.                   ReadWord(&Buffer,&Word,Pos);
  671.                   if (strlen(&Word))
  672.                      strcpy(&Cfg.AreaStatIntro1st,&Word);
  673.                }
  674.  
  675.                if (!stricmp(&Word,CFG_area_stat_intro_next)) {
  676.                   ReadWord(&Buffer,&Word,Pos);
  677.                   if (strlen(&Word))
  678.                      strcpy(&Cfg.AreaStatIntroNext,&Word);
  679.                }
  680.  
  681.                if (!stricmp(&Word,CFG_header_top_files)) {
  682.                   ReadWord(&Buffer,&Word,Pos);
  683.                   if (strlen(&Word)>2)
  684.                      strcpy(&Cfg.HeaderTopFiles,&Word);
  685.                }
  686.  
  687.                if (!stricmp(&Word,CFG_header_top_boards)) {
  688.                   ReadWord(&Buffer,&Word,Pos);
  689.                   if (strlen(&Word)>2)
  690.                      strcpy(&Cfg.HeaderTopBoards,&Word);
  691.                }
  692.  
  693.                if (!stricmp(&Word,CFG_header_area_stat)) {
  694.                   ReadWord(&Buffer,&Word,Pos);
  695.                   if (strlen(&Word)>2)
  696.                      strcpy(&Cfg.HeaderAreaStat,&Word);
  697.                }
  698.  
  699.                if (!stricmp(&Word,CFG_header_user_stat)) {
  700.                   ReadWord(&Buffer,&Word,Pos);
  701.                   if (strlen(&Word)>2)
  702.                      strcpy(&Cfg.HeaderUserStat,&Word);
  703.                }
  704.  
  705.                if (!stricmp(&Word,CFG_footer_top_files)) {
  706.                   ReadWord(&Buffer,&Word,Pos);
  707.                   if (strlen(&Word)>2)
  708.                      strcpy(&Cfg.FooterTopFiles,&Word);
  709.                }
  710.  
  711.                if (!stricmp(&Word,CFG_footer_top_boards)) {
  712.                   ReadWord(&Buffer,&Word,Pos);
  713.                   if (strlen(&Word)>2)
  714.                      strcpy(&Cfg.FooterTopBoards,&Word);
  715.                }
  716.  
  717.                if (!stricmp(&Word,CFG_show_file_header)) {
  718.                   ReadWord(&Buffer,&Word,Pos);
  719.                   if (!stricmp(&Word,CFG_nein))
  720.                      Cfg.ShowFileHeader=FALSE;
  721.                   if (!stricmp(&Word,CFG_no))
  722.                      Cfg.ShowFileHeader=FALSE;
  723.                }
  724.  
  725.                if (!stricmp(&Word,CFG_show_file_footer)) {
  726.                   ReadWord(&Buffer,&Word,Pos);
  727.                   if (!stricmp(&Word,CFG_ja))
  728.                      Cfg.ShowFileFooter=TRUE;
  729.                   if (!stricmp(&Word,CFG_yes))
  730.                      Cfg.ShowFileFooter=TRUE;
  731.                }
  732.  
  733.                if (!stricmp(&Word,CFG_show_board_header)) {
  734.                   ReadWord(&Buffer,&Word,Pos);
  735.                   if (!stricmp(&Word,CFG_nein))
  736.                      Cfg.ShowBoardHeader=FALSE;
  737.                   if (!stricmp(&Word,CFG_no))
  738.                      Cfg.ShowBoardHeader=FALSE;
  739.                }
  740.  
  741.                if (!stricmp(&Word,CFG_show_board_footer)) {
  742.                   ReadWord(&Buffer,&Word,Pos);
  743.                   if (!stricmp(&Word,CFG_ja))
  744.                      Cfg.ShowBoardFooter=TRUE;
  745.                   if (!stricmp(&Word,CFG_yes))
  746.                      Cfg.ShowBoardFooter=TRUE;
  747.                }
  748.  
  749.                if (!stricmp(&Word,CFG_show_area_stat_header)) {
  750.                   ReadWord(&Buffer,&Word,Pos);
  751.                   if (!stricmp(&Word,CFG_nein))
  752.                      Cfg.ShowAreaStatHeader=FALSE;
  753.                   if (!stricmp(&Word,CFG_no))
  754.                      Cfg.ShowAreaStatHeader=FALSE;
  755.                }
  756.  
  757.                if (!stricmp(&Word,CFG_show_user_stat_header)) {
  758.                   ReadWord(&Buffer,&Word,Pos);
  759.                   if (!stricmp(&Word,CFG_nein))
  760.                      Cfg.ShowUserStatHeader=FALSE;
  761.                   if (!stricmp(&Word,CFG_no))
  762.                      Cfg.ShowUserStatHeader=FALSE;
  763.                }
  764.  
  765.                if (!stricmp(&Word,CFG_sort_user_stat)) {
  766.                   ReadWord(&Buffer,&Word,Pos);
  767.                   if (!stricmp(&Word,CFG_nein))
  768.                      Cfg.SortUserStat=FALSE;
  769.                   if (!stricmp(&Word,CFG_no))
  770.                      Cfg.SortUserStat=FALSE;
  771.                }
  772.  
  773.                if (!stricmp(&Word,CFG_hidden_area)) {
  774.                   ReadWord(&Buffer,&Word,Pos);
  775.                   if (Data=AllocPooled(PoolHeader,sizeof(struct HiddenData))) {
  776.                      strcpy(&Data->String,&Word);
  777.                      strupr(&Data->String);
  778.                      AddTail(&Cfg.HiddenAreas,Data);
  779.                   }
  780.                }
  781.  
  782.                if (!stricmp(&Word,CFG_hidden_board)) {
  783.                   ReadWord(&Buffer,&Word,Pos);
  784.                   if (Data=AllocPooled(PoolHeader,sizeof(struct HiddenData))) {
  785.                      strcpy(&Data->String,&Word);
  786.                      strupr(&Data->String);
  787.                      AddTail(&Cfg.HiddenBoards,Data);
  788.                   }
  789.                }
  790.  
  791.                if (!stricmp(&Word,CFG_allowed_user)) {
  792.                   ReadWord(&Buffer,&Word,Pos);
  793.                   if (!Cfg.AllowedUser) {
  794.                      if (Cfg.AllowedUser=AllocPooled(PoolHeader,sizeof(struct List)))
  795.                         NewList(Cfg.AllowedUser);
  796.                   }
  797.                   if (Cfg.AllowedUser && (Data=AllocPooled(PoolHeader,sizeof(struct HiddenData))) ) {
  798.                      strcpy(&Data->String,&Word);
  799.                      strupr(&Data->String);
  800.                      AddTail(Cfg.AllowedUser,Data);
  801.                   }
  802.                }
  803.  
  804.                if (!stricmp(&Word,CFG_forbidden_user)) {
  805.                   ReadWord(&Buffer,&Word,Pos);
  806.                   if (!Cfg.ForbiddenUser) {
  807.                      if (Cfg.ForbiddenUser=AllocPooled(PoolHeader,sizeof(struct List)))
  808.                         NewList(Cfg.ForbiddenUser);
  809.                   }
  810.                   if (Cfg.ForbiddenUser && (Data=AllocPooled(PoolHeader,sizeof(struct HiddenData))) ) {
  811.                      strcpy(&Data->String,&Word);
  812.                      strupr(&Data->String);
  813.                      AddTail(Cfg.ForbiddenUser,Data);
  814.                   }
  815.                }
  816.  
  817.                if (!stricmp(&Word,CFG_forbidden_text)) {
  818.                   ReadWord(&Buffer,&Word,Pos);
  819.                   if (strlen(&Word)>2)
  820.                      strcpy(&Cfg.ForbiddenText,&Word);
  821.                }
  822.  
  823.             }
  824.          }
  825.  
  826.       }
  827.       Close(F);
  828.    }
  829.    return RetCfg;
  830. }
  831.  
  832. static __inline BOOL InList(char *Pfad, struct List *List)
  833. {
  834.    struct HiddenData    *TempData;
  835.  
  836.    TempData = (struct HiddenData*) List->lh_Head;
  837.  
  838.    while (TempData->node.ln_Succ) {
  839.       if (!stricmp(Pfad,&TempData->String))
  840.          return TRUE;
  841.       TempData = (struct HiddenData *) TempData->node.ln_Succ;
  842.    }
  843.    return FALSE;
  844. }
  845.  
  846. static struct DownloadInfo *FileInList(char *File)
  847. {
  848.    struct DownloadInfo    *TempDown;
  849.  
  850.    TempDown = (struct DownloadInfo*) TopFiles.lh_Head;
  851.    while (TempDown->node.ln_Succ) {
  852.       if (!strcmp(&TempDown->FirstDown->Name2,File))
  853.          return TempDown;
  854.       TempDown = (struct DownloadInfo*) TempDown->node.ln_Succ;
  855.    }
  856.    return NULL;
  857. }
  858.  
  859. static struct AreaStatInfo *UserInList(char *User, struct List *Liste)
  860. {
  861.    struct AreaStatInfo    *TempAreaStat;
  862.  
  863.    TempAreaStat = (struct AreaStatInfo*) Liste->lh_Head;
  864.    while (TempAreaStat->node.ln_Succ) {
  865.       if (!strcmp(&TempAreaStat->User,User))
  866.          return TempAreaStat;
  867.       TempAreaStat = (struct AreaStatInfo*) TempAreaStat->node.ln_Succ;
  868.    }
  869.    return NULL;
  870. }
  871.  
  872. static struct BoardInfo *BoardInList(char *Board1, char *Board2)
  873. {
  874.    struct BoardInfo    *TempBoard;
  875.  
  876.    TempBoard = (struct BoardInfo*) TopBoards.lh_Head;
  877.    while (TempBoard->node.ln_Succ) {
  878.       if ( (!strcmp(&TempBoard->Data->Name1,Board1)) && (!strcmp(&TempBoard->Data->Name2,Board2)) )
  879.          return TempBoard;
  880.       TempBoard = (struct BoardInfo*) TempBoard->node.ln_Succ;
  881.    }
  882.    return NULL;
  883. }
  884.  
  885. static void CodeDate(char *Datum, char *Time, struct DateStamp *CodeDate)
  886. {
  887.    struct DateTime    DT;
  888.  
  889.    DT.dat_Format  = FORMAT_CDN;
  890.    DT.dat_Flags   = 0;
  891.    DT.dat_StrDay  = NULL;
  892.    DT.dat_StrDate = Datum;
  893.    DT.dat_StrTime = Time;
  894.    if (StrToDate(&DT)) {
  895.         *CodeDate=DT.dat_Stamp;
  896.    }
  897.    else {
  898.       memset(CodeDate,0,sizeof(struct DateStamp));
  899.    }
  900. }
  901.  
  902. static void DecodeDate(char *Datum, char *Time, struct DateStamp *DecodeDate)
  903. {
  904.    struct DateTime    DT;
  905.  
  906.    DT.dat_Format  = FORMAT_CDN;
  907.    DT.dat_Flags   = 0;
  908.    DT.dat_StrDay  = NULL;
  909.    DT.dat_StrDate = Datum;
  910.    DT.dat_StrTime = Time;
  911.    DT.dat_Stamp   = *DecodeDate;
  912.  
  913.    if (!DateToStr(&DT)) {
  914.       strcpy(Datum,""); strcpy(Time,"");
  915.    }
  916. }
  917.  
  918. static __inline char *CopyPart(char *Zeile,char *Buffer,char EndZeichen1,char EndZeichen2)
  919. {
  920.    while (*Zeile!=EndZeichen1 && *Zeile!=EndZeichen2 && *Zeile!=0) {
  921.       *Buffer=*Zeile;
  922.       Buffer++;
  923.       Zeile++;
  924.    }
  925.    *Buffer=0;
  926.    return Zeile;
  927. }
  928.  
  929. static struct LineFormat *Decode1Line(char *Zeile)
  930. {
  931.    int            i,i2;
  932.    char            DateStr[10];
  933.    char            TimeStr[10];
  934.    char            TempStr[128];
  935.    struct LineFormat    *L;
  936.    BOOL            DriveFlag = FALSE;
  937.  
  938.    if (!(L = AllocPooled(PoolHeader,sizeof(struct LineFormat))))
  939.       return NULL;
  940.  
  941.    Zeile=CopyPart(Zeile,&DateStr,' ',' ');
  942.    Zeile++;
  943.  
  944.    Zeile=CopyPart(Zeile,&TimeStr,',',',');
  945.    Zeile += 3;
  946.  
  947.    CodeDate(&DateStr,&TimeStr,&L->Datum);
  948.  
  949.    Zeile=CopyPart(Zeile,&TempStr,' ',',');
  950.    if (*Zeile==' ') {
  951.       Zeile += 3;
  952.    }
  953.    else {
  954.       Zeile += 2;
  955.    }
  956.  
  957.    L->PortNr=strtol(&TempStr,NULL,10);
  958.    if (!(Cfg.Ports & L->PortNr)) {
  959.       FreePooled(PoolHeader,L,sizeof(struct LineFormat));
  960.       return NULL;
  961.    }
  962.  
  963.    Zeile=CopyPart(Zeile,&TempStr,':',',');
  964.    Zeile += 2;
  965.  
  966.    L->Action=LF_Unbekannt;
  967.    if (!strcmp(&TempStr,"Upl")) L->Action=LF_Upl;
  968.    if (!strcmp(&TempStr,"Dwn")) L->Action=LF_Dwn;
  969.    if (!strcmp(&TempStr,"Msg")) L->Action=LF_Msg;
  970.    if (!strcmp(&TempStr,"Txt")) L->Action=LF_Txt;
  971.    if (!strcmp(&TempStr,"Bin")) L->Action=LF_Bin;
  972.  
  973.    Zeile=CopyPart(Zeile,&L->User,',',',');
  974.    Zeile += 2;
  975.  
  976.    Zeile=CopyPart(Zeile,&TempStr,' ',' ');
  977.    L->Laenge=strtol(&TempStr,NULL,10);
  978.    Zeile += 8;
  979.  
  980.    if ((L->Action==LF_Upl) || (L->Action==LF_Dwn)) {
  981.  
  982.       Zeile=CopyPart(Zeile,&TempStr,' ',',');
  983.       if (!strcmp(&TempStr,"<local>")) {
  984.          L->Cps=-1;
  985.          Zeile += 2;
  986.       }
  987.       else {
  988.          L->Cps=strtol(&TempStr,NULL,10);
  989.          Zeile += 6;
  990.       }
  991.  
  992.       i = 0;
  993.       while (*Zeile!='\012') {
  994.          if (*Zeile==':') DriveFlag=TRUE;
  995.          L->Name1[i]=*Zeile++;
  996.          i++;
  997.       }
  998.       L->Name1[i]=0;
  999.  
  1000.       if (DriveFlag) {
  1001.  
  1002.          while ((i>=0) && (L->Name1[i]!='/') && (L->Name1[i]!=':')) {
  1003.             i--;
  1004.             Zeile--;
  1005.          }
  1006.  
  1007.          if (L->Name1[i]==':')
  1008.             i++;
  1009.  
  1010.          L->Name1[i]=0;
  1011.  
  1012.          strcpy(&TempStr,&L->Name1);
  1013.          i2=0;
  1014.          while (TempStr[i2]!=':')
  1015.             i2++;
  1016.          i2+=2;
  1017.  
  1018.          strmid(&TempStr,&L->Name1,i2,strlen(&TempStr)-1);
  1019.  
  1020.          if ( (InList(&L->Name1,&Cfg.HiddenAreas)) || (strstr(&L->Name1,outgoing)) ) {
  1021.             FreePooled(PoolHeader,L,sizeof(struct LineFormat));
  1022.             return NULL;
  1023.          }
  1024.  
  1025.          Zeile++;
  1026.  
  1027.          CopyPart(Zeile,&L->Name2,'\012','\012');
  1028.  
  1029.       }
  1030.       else {
  1031.          strcpy(&L->Name2,&L->Name1);
  1032.          L->Name1[0]=0;
  1033.       }
  1034.    }
  1035.    else {
  1036.       Zeile=CopyPart(Zeile,&TempStr,' ',' ');
  1037.       L->Dauer=strtol(&TempStr,NULL,10);
  1038.       Zeile += 7;
  1039.  
  1040.       if (L->Action==LF_Msg) {
  1041.          Zeile=CopyPart(Zeile,&L->Name1,'\012','\012');
  1042.  
  1043.          if (InList(&L->Name1,&Cfg.HiddenBoards)) {
  1044.             FreePooled(PoolHeader,L,sizeof(struct LineFormat));
  1045.             return NULL;
  1046.          }
  1047.  
  1048.          i=strlen(&L->Name1);
  1049.  
  1050.          while ( (i>=0) && (L->Name1[i]!='/') ) {
  1051.             i--;
  1052.             Zeile--;
  1053.          }
  1054.          L->Name1[i]=0;
  1055.  
  1056.          Zeile++;
  1057.          CopyPart(Zeile,&L->Name2,'\012','\012');
  1058.       }
  1059.       else {
  1060.          CopyPart(Zeile,&L->AnUser,'\012','\012');
  1061.       }
  1062.    }
  1063.    return L;
  1064. }
  1065.  
  1066. static BOOL ScanLogFile(char *Name, int BuffSize)
  1067. {
  1068.    BPTR            F;
  1069.    char            *LineBuffer[max_line_length];
  1070.    struct LineFormat    *Line;
  1071.    int            MaxLength;
  1072.  
  1073.    if (DOSBase->dl_lib.lib_Version>=39) {
  1074.       MaxLength=max_line_length;
  1075.    }
  1076.    else {
  1077.       MaxLength=max_line_length-1;
  1078.    }
  1079.  
  1080.    if (!(F=Open(Name,MODE_OLDFILE)))
  1081.       return FALSE;
  1082.  
  1083.    SetVBuf(F,NULL,0,BuffSize);
  1084.  
  1085.    while (FGets(F,&LineBuffer,MaxLength)) {
  1086.       if (Line=Decode1Line(&LineBuffer))
  1087.          AddTail(&LineList,Line);
  1088.            
  1089.    }
  1090.    Close(F);
  1091.    return TRUE;
  1092. }
  1093.  
  1094. static void WriteDefFilesHeader(char *DateStr, char *TimeStr)
  1095. {
  1096.    puts("\\6\\1+--------------------+-----------------------+---------------------------------+");
  1097.    puts("\\6\\1|      \\0\\6\\2\\1EazyLog\\0\\6\\1       |     Version "raw_version"       |  (c) 1994 by Thomas Patschinski |");
  1098.    puts("\\6\\1+--------------------+-----------------------+---------------------------------+");
  1099.    printf("\\6\\1      Top Files                                \\7Generated on %s at %s\n",DateStr,TimeStr);
  1100.    puts("\\6\\1--------------------------------------------------------------------------------");
  1101.    puts("\\9\\1 Rang    Filename                 gezogen    File Area            Uploader      ");
  1102.    puts("\\9\\1================================================================================\n");
  1103. }
  1104.  
  1105. static void WriteDefBoardsHeader(char *DateStr, char *TimeStr)
  1106. {
  1107.    puts("\\6\\1+--------------------+-----------------------+---------------------------------+");
  1108.    puts("\\6\\1|      \\0\\6\\2\\1EazyLog\\0\\6\\1       |     Version "raw_version"       |  (c) 1994 by Thomas Patschinski |");
  1109.    puts("\\6\\1+--------------------+-----------------------+---------------------------------+");
  1110.    printf("\\6\\1      Top Boards                               \\7Generated on %s at %s\n",DateStr,TimeStr);
  1111.    puts("\\6\\1--------------------------------------------------------------------------------");
  1112.    puts("\\9\\1     Rang        Boardname             wie oft beschrieben                      ");
  1113.    puts("\\9\\1================================================================================\n");
  1114. }
  1115.  
  1116. static void WriteDefAreaStatHeader(char *DateStr, char *TimeStr)
  1117. {
  1118.    puts("\\6\\1+--------------------+-----------------------+---------------------------------+");
  1119.    puts("\\6\\1|      \\0\\6\\2\\1EazyLog\\0\\6\\1       |     Version "raw_version"       |  (c) 1994 by Thomas Patschinski |");
  1120.    puts("\\6\\1+--------------------+-----------------------+---------------------------------+");
  1121.    printf("\\6\\1      Area Stat                                \\7Generated on %s at %s\n",DateStr,TimeStr);
  1122.    puts("\\6\\1--------------------------------------------------------------------------------");
  1123.    puts("\\9\\1  Rang  Uploader        Anz.    GesLänge     Downloader      Anz.    GesLänge   ");
  1124.    puts("\\9\\1================================================================================\n");
  1125. }
  1126.  
  1127. static void WriteDefUserStatHeader(char *DateStr, char *TimeStr)
  1128. {
  1129.    puts("\\6\\1+--------------------+-----------------------+---------------------------------+");
  1130.    puts("\\6\\1|      \\0\\6\\2\\1EazyLog\\0\\6\\1       |     Version "raw_version"       |  (c) 1994 by Thomas Patschinski |");
  1131.    puts("\\6\\1+--------------------+-----------------------+---------------------------------+");
  1132.    printf("\\6\\1      User Stat                                \\7Generated on %s at %s\n",DateStr,TimeStr);
  1133.    puts("\\6\\1--------------------------------------------------------------------------------");
  1134.    puts("\\9\\1  Rang     Filename                               Länge     Datum               ");
  1135.    puts("\\9\\1================================================================================\n");
  1136. }
  1137.  
  1138. static void WriteHeader(char *HeaderName, int WhichHeader, char *StatName)
  1139. {
  1140.    BPTR        F;
  1141.    char        DateStr[16];
  1142.    char        TimeStr[16];
  1143.    char        Buffer[max_line_length];
  1144.    int        i,j,MaxLength;
  1145.  
  1146.    if (DOSBase->dl_lib.lib_Version>=39) {
  1147.       MaxLength=max_line_length;
  1148.    }
  1149.    else {
  1150.       MaxLength=max_line_length-1;
  1151.    }
  1152.  
  1153.    AktDate(&DateStr,&TimeStr);
  1154.  
  1155.    if(F=Open(HeaderName,MODE_OLDFILE)) {
  1156.       while (FGets(F,&Buffer,MaxLength)) {
  1157.          i=0;
  1158.          while (Buffer[i]!=0) {
  1159.             if (Buffer[i]=='%') {
  1160.                i++;
  1161.                switch (Buffer[i]) {
  1162.                   case '%': putchar('%');
  1163.                             break;
  1164.                   case 'v':
  1165.                   case 'V': printf(raw_version);
  1166.                             break;
  1167.                   case 'd':
  1168.                   case 'D': printf("%s at %s",DateStr,TimeStr);
  1169.                             break;
  1170.                   case 'a':
  1171.                   case 'A': WriteInt(Cfg.DaysAgo,3);
  1172.                             break;
  1173.                   case 's':
  1174.                   case 'S': if (StatName) {
  1175.                                printf(StatName);
  1176.                                for (j=strlen(StatName);j<31;j++)
  1177.                                   putchar(' ');
  1178.                             }
  1179.                             break;
  1180.                   case 'u':
  1181.                   case 'U': if (StatName) {
  1182.                                printf(StatName);
  1183.                                for (j=strlen(StatName);j<15;j++)
  1184.                                   putchar(' ');
  1185.                             }
  1186.                             break;
  1187.                   default:  putchar(Buffer[i]);
  1188.                }
  1189.             }
  1190.             else {
  1191.                putchar(Buffer[i]);
  1192.             }
  1193.             i++;
  1194.          }
  1195.       }
  1196.       Close(F);
  1197.    }
  1198.    else {
  1199.       switch (WhichHeader) {
  1200.          case HT_Files:    WriteDefFilesHeader(&DateStr,&TimeStr);
  1201.                            break;
  1202.          case HT_Boards:   WriteDefBoardsHeader(&DateStr,&TimeStr);
  1203.                            break;
  1204.          case HT_AreaStat: WriteDefAreaStatHeader(&DateStr,&TimeStr);
  1205.                            break;
  1206.          case HT_UserStat: WriteDefUserStatHeader(&DateStr,&TimeStr);
  1207.       }
  1208.    }
  1209. }
  1210.  
  1211. static void WriteDefFooter(int Anzahl)
  1212. {
  1213.    printf("\nAnzahl der nicht angezeigten Plätze:%d\n",Anzahl);
  1214. }
  1215.  
  1216. static void WriteFooter(char *FooterName, int GesRanks, int ShownRanks, int Gesamt, int Shown)
  1217. {
  1218.    BPTR        F;
  1219.    char        Buffer[max_line_length];
  1220.    int        i,MaxLength;
  1221.  
  1222.    if (DOSBase->dl_lib.lib_Version>=39) {
  1223.       MaxLength=max_line_length;
  1224.    }
  1225.    else {
  1226.       MaxLength=max_line_length-1;
  1227.    }
  1228.  
  1229.    if (F=Open(FooterName,MODE_OLDFILE)) {
  1230.       while (FGets(F,&Buffer,MaxLength)) {
  1231.          i=0;
  1232.          while (Buffer[i]!=0) {
  1233.             if (Buffer[i]=='%') {
  1234.                i++;
  1235.                switch (Buffer[i]) {
  1236.                   case '%': putchar('%');
  1237.                             break;
  1238.                   case '1': WriteInt(Gesamt,3);
  1239.                             break;
  1240.                   case '2': WriteInt(Shown,3);
  1241.                             break;
  1242.                   case '3': WriteInt(GesRanks,3);
  1243.                             break;
  1244.                   case '4': WriteInt(ShownRanks,3);
  1245.                             break;
  1246.                   case '5': WriteInt(GesRanks-ShownRanks,3);
  1247.                             break;
  1248.                   default:  putchar(Buffer[i]);
  1249.                }
  1250.             }
  1251.             else {
  1252.                putchar(Buffer[i]);
  1253.             }
  1254.             i++;
  1255.          }
  1256.       }
  1257.       Close(F);
  1258.    }
  1259.    else {
  1260.       WriteDefFooter(GesRanks-ShownRanks);
  1261.    }
  1262. }
  1263.  
  1264. static APTR GetNextRankItem(int Nummer, struct List *Liste)
  1265. {
  1266.    struct UniInfo    *TopNode,*PrevTopNode=NULL;
  1267.  
  1268.    TopNode = (struct UniInfo*) Liste->lh_Head;
  1269.    while (TopNode->node.ln_Succ) {
  1270.       if (TopNode->Anzahl>=Nummer)
  1271.          PrevTopNode=TopNode;
  1272.       if (TopNode->Anzahl<Nummer)
  1273.          return PrevTopNode;
  1274.       TopNode = (struct UniInfo*) TopNode->node.ln_Succ;
  1275.    }
  1276.    return PrevTopNode;
  1277. }
  1278.  
  1279. static void MakeTopFileListe(int *Anzahl1, int *Anzahl2)
  1280. {
  1281.    struct LineFormat    *LineNode;
  1282.    struct DownloadInfo    *TopNode;
  1283.    struct DateStamp    AktDate;
  1284.  
  1285.    *Anzahl1=*Anzahl2=0;
  1286.    DateStamp(&AktDate);
  1287.  
  1288.    /* Zuerst alle Downs in die Liste eintragen */
  1289.  
  1290.    LineNode = (struct LineFormat*) LineList.lh_Head;
  1291.    while (LineNode->node.ln_Succ) {
  1292.       if (LineNode->Action==LF_Dwn) {
  1293.          *Anzahl1=*Anzahl1+1;
  1294.          if (LineNode->Datum.ds_Days>=AktDate.ds_Days-Cfg.DaysAgo) {
  1295.             *Anzahl2=*Anzahl2+1;
  1296.             if (TopNode=FileInList(&LineNode->Name2)) {
  1297.                TopNode->Anzahl++;
  1298.             }
  1299.             else {
  1300.                if (TopNode=AllocPooled(PoolHeader,sizeof(struct DownloadInfo))) {
  1301.                   TopNode->Anzahl    = 1;
  1302.                   TopNode->FirstDown = LineNode;
  1303.                   TopNode->Uploader  = NULL;
  1304.                   AddTail(&TopFiles,TopNode);
  1305.                }
  1306.             }
  1307.          }
  1308.       }
  1309.       LineNode = (struct LineFormat*) LineNode->node.ln_Succ;
  1310.    }
  1311.  
  1312.    /* Jetzt die Uploader nachtragen (Falls noch in der Liste) */
  1313.  
  1314.    LineNode = (struct LineFormat*) LineList.lh_Head;
  1315.    while (LineNode->node.ln_Succ) {
  1316.       if (LineNode->Action==LF_Upl) {
  1317.          if (TopNode=FileInList(LineNode->Name2))
  1318.             TopNode->Uploader=LineNode;
  1319.       }
  1320.       LineNode = (struct LineFormat*) LineNode->node.ln_Succ;
  1321.    }
  1322. }
  1323.  
  1324. static void SortTopFiles(void)
  1325. {
  1326.    struct DownloadInfo    *TopNode,*PrevTopNode;
  1327.  
  1328.    NewList(&TempListe);
  1329.  
  1330.    while (TopNode = (struct DownloadInfo*) RemTail(&TopFiles)) {
  1331.       if (PrevTopNode=GetNextRankItem(TopNode->Anzahl,&TempListe)) {
  1332.          Insert(&TempListe,TopNode,PrevTopNode);
  1333.       }
  1334.       else {
  1335.          AddHead(&TempListe,TopNode);
  1336.       }
  1337.    }
  1338.    TopFiles=TempListe;
  1339. }
  1340.  
  1341. static void ShowTopFiles(int *Anzahl1, int *Anzahl2)
  1342. {
  1343.    struct DownloadInfo    *TopNode;
  1344.    int            Rang=1;
  1345.    int            i;
  1346.  
  1347.    *Anzahl1=*Anzahl2=0;
  1348.  
  1349.    TopNode = (struct DownloadInfo*) TopFiles.lh_Head;
  1350.    while (TopNode->node.ln_Succ) {
  1351.       if (Rang==1)
  1352.          printf(&Cfg.FileIntro1st);
  1353.       if (Rang>1 && Rang<=Cfg.TopFiles)
  1354.          printf(&Cfg.FileIntroNext);
  1355.       if (Rang<=Cfg.TopFiles) {
  1356.          *Anzahl2=*Anzahl2+1;
  1357.          WriteInt(Rang,3); printf("   ");
  1358.          printf(TopNode->FirstDown->Name2);
  1359.          for (i=strlen(&TopNode->FirstDown->Name2);i<=30;i++)
  1360.             putchar(' ');
  1361.  
  1362.          WriteInt(TopNode->Anzahl,3);
  1363.          if (strlen(TopNode->FirstDown->Name1)==0)
  1364.             strcpy(&TopNode->FirstDown->Name1,"CD-Rom");
  1365.          printf("   %s",&TopNode->FirstDown->Name1);
  1366.          for (i=strlen(&TopNode->FirstDown->Name1);i<=23;i++)
  1367.             putchar(' ');
  1368.  
  1369.          if (TopNode->Uploader) {
  1370.             printf(&TopNode->Uploader->User);
  1371.             for (i=strlen(&TopNode->Uploader->User);i<=12;i++)
  1372.                putchar(' ');
  1373.          }
  1374.          else {
  1375.             printf("            ");
  1376.          }
  1377.          putchar('\n');
  1378.       }
  1379.       if (Rang==1)
  1380.          putchar('\n');
  1381.       Rang++;
  1382.       *Anzahl1=*Anzahl1+1;
  1383.       TopNode=(struct DownloadInfo*)TopNode->node.ln_Succ;
  1384.    }        
  1385. }
  1386.  
  1387. static void MakeTopBoardListe(int *Anzahl1, int *Anzahl2)
  1388. {
  1389.    struct LineFormat    *LineNode;
  1390.    struct BoardInfo    *BoardNode;
  1391.    struct DateStamp    AktDate;
  1392.  
  1393.    *Anzahl1=*Anzahl2=0;
  1394.    DateStamp(&AktDate);
  1395.  
  1396.    LineNode = (struct LineFormat*) LineList.lh_Head;
  1397.    while (LineNode->node.ln_Succ) {
  1398.       if (LineNode->Action==LF_Msg) {
  1399.          *Anzahl1=*Anzahl1+1;
  1400.          if (LineNode->Datum.ds_Days>=AktDate.ds_Days-Cfg.DaysAgo) {
  1401.             *Anzahl2=*Anzahl2+1;
  1402.             if (BoardNode=BoardInList(&LineNode->Name1,&LineNode->Name2)) {
  1403.                BoardNode->Anzahl++;
  1404.             }
  1405.             else {
  1406.                if (BoardNode=AllocPooled(PoolHeader,sizeof(struct BoardInfo))) {
  1407.                   BoardNode->Anzahl = 1;
  1408.                   BoardNode->Data   = LineNode;
  1409.                   AddTail(&TopBoards,BoardNode);
  1410.                }
  1411.             }
  1412.          }
  1413.       }
  1414.       LineNode = (struct LineFormat*) LineNode->node.ln_Succ;
  1415.    }
  1416. }
  1417.  
  1418. static void SortTopBoards(void)
  1419. {
  1420.    struct BoardInfo    *BoardNode,*PrevBoardNode;
  1421.  
  1422.    NewList(&TempListe);
  1423.  
  1424.    while (BoardNode = (struct BoardInfo*) RemTail(&TopBoards)) {
  1425.       if (PrevBoardNode=GetNextRankItem(BoardNode->Anzahl,&TempListe)) {
  1426.          Insert(&TempListe,BoardNode,PrevBoardNode);
  1427.       }
  1428.       else {
  1429.          AddHead(&TempListe,BoardNode);
  1430.       }
  1431.    }
  1432.    TopBoards=TempListe;
  1433. }
  1434.  
  1435. static void ShowTopBoards(int *Anzahl1, int *Anzahl2)
  1436. {
  1437.    struct BoardInfo    *BoardNode;
  1438.    int            i,Rang=1;
  1439.  
  1440.    *Anzahl1=*Anzahl2=0;
  1441.  
  1442.    BoardNode = (struct BoardInfo*) TopBoards.lh_Head;
  1443.    while (BoardNode->node.ln_Succ) {
  1444.       if (Rang==1)
  1445.          printf(&Cfg.BoardIntro1st);
  1446.       if (Rang>1 && Rang<=Cfg.TopBoards)
  1447.          printf(&Cfg.BoardIntroNext);
  1448.       if (Rang<=Cfg.TopBoards) {
  1449.          *Anzahl2=*Anzahl2+1;
  1450.          printf("    ");
  1451.          WriteInt(Rang,3);
  1452.          printf("     ");
  1453.          printf(&BoardNode->Data->Name1);
  1454.          putchar('/');
  1455.          printf(&BoardNode->Data->Name2);
  1456.  
  1457.          for (i=strlen(&BoardNode->Data->Name1)+strlen(&BoardNode->Data->Name2);i<=35;i++)
  1458.             putchar(' ');
  1459.  
  1460.          WriteInt(BoardNode->Anzahl,3);
  1461.          printf("                            \n");
  1462.       }
  1463.       if (Rang==1)
  1464.          putchar('\n');
  1465.       Rang++;
  1466.       *Anzahl1=*Anzahl1+1;
  1467.       BoardNode = (struct BoardInfo*) BoardNode->node.ln_Succ;
  1468.    }
  1469. }
  1470.  
  1471. static void MakeAreaStatListe(char *AreaName)
  1472. {
  1473.    struct LineFormat    *LineNode;
  1474.    struct AreaStatInfo    *AreaNode;
  1475.    struct DateStamp    AktDate;
  1476.  
  1477.    DateStamp(&AktDate);
  1478.  
  1479.    /* AreaStat Down Liste erstellen */
  1480.  
  1481.    LineNode = (struct LineFormat*) LineList.lh_Head;
  1482.    while (LineNode->node.ln_Succ) {
  1483.       if (LineNode->Action==LF_Dwn) {
  1484.          if ( (LineNode->Laenge) && (LineNode->Datum.ds_Days>=AktDate.ds_Days-Cfg.DaysAgo) ) {
  1485.             if (!stricmp(&LineNode->Name1,AreaName)) {
  1486.                if (AreaNode=UserInList(&LineNode->User,&AreaDownListe)) {
  1487.                   AreaNode->Anzahl++;
  1488.                   AreaNode->GesLaenge += LineNode->Laenge;
  1489.                }
  1490.                else {
  1491.                   if (AreaNode=AllocPooled(PoolHeader,sizeof(struct AreaStatInfo))) {
  1492.                      AreaNode->Anzahl    = 1;
  1493.                      AreaNode->GesLaenge = LineNode->Laenge;
  1494.                      strcpy(&AreaNode->User,&LineNode->User);
  1495.                      AddTail(&AreaDownListe,AreaNode);
  1496.                   }
  1497.                }
  1498.             }
  1499.          }
  1500.       }
  1501.       LineNode = (struct LineFormat*) LineNode->node.ln_Succ;
  1502.    }
  1503.  
  1504.    /* AreaStat Up Liste erstellen */
  1505.  
  1506.    LineNode = (struct LineFormat*) LineList.lh_Head;
  1507.    while (LineNode->node.ln_Succ) {
  1508.       if (LineNode->Action==LF_Upl) {
  1509.          if ( (LineNode->Laenge) && (LineNode->Datum.ds_Days>=AktDate.ds_Days-Cfg.DaysAgo) ) {
  1510.             if (!stricmp(&LineNode->Name1,AreaName)) {
  1511.                if (AreaNode=UserInList(&LineNode->User,&AreaUpListe)) {
  1512.                   AreaNode->Anzahl++;
  1513.                   AreaNode->GesLaenge += LineNode->Laenge;
  1514.                }
  1515.                else {
  1516.                   if (AreaNode=AllocPooled(PoolHeader,sizeof(struct AreaStatInfo))) {
  1517.                      AreaNode->Anzahl    = 1;
  1518.                      AreaNode->GesLaenge = LineNode->Laenge;
  1519.                      strcpy(&AreaNode->User,&LineNode->User);
  1520.                      AddTail(&AreaUpListe,AreaNode);
  1521.                   }
  1522.                }
  1523.             }
  1524.          }
  1525.       }
  1526.       LineNode = (struct LineFormat*) LineNode->node.ln_Succ;
  1527.    }
  1528. }
  1529.  
  1530. static void SortUniStat(struct List *Liste)
  1531. {
  1532.    struct UniStatInfo    *Node,*PrevNode;
  1533.  
  1534.    NewList(&TempListe);
  1535.  
  1536.    while (Node = (struct UniStatInfo*) RemTail(Liste)) {
  1537.       if (PrevNode=GetNextRankItem(Node->Anzahl,&TempListe)) {
  1538.          Insert(&TempListe,Node,PrevNode);
  1539.       }
  1540.       else {
  1541.          AddHead(&TempListe,Node);
  1542.       }
  1543.    }
  1544.    *Liste=TempListe;
  1545. }
  1546.  
  1547. static void ShowAreaStat(void)
  1548. {
  1549.    struct AreaStatInfo    *AreaUpNode,*AreaDownNode;
  1550.    int            i,Rang=1;
  1551.  
  1552.    AreaUpNode   = (struct AreaStatInfo*) AreaUpListe.lh_Head;
  1553.    AreaDownNode = (struct AreaStatInfo*) AreaDownListe.lh_Head;
  1554.    while ( (AreaUpNode->node.ln_Succ) || (AreaDownNode->node.ln_Succ) ) {
  1555.       if (Rang==1)
  1556.          printf(&Cfg.AreaStatIntro1st);
  1557.       if (Rang>1 && Rang<=Cfg.TopAreaStat)
  1558.          printf(&Cfg.AreaStatIntroNext);
  1559.       if (Rang<=Cfg.TopAreaStat) {
  1560.          printf("  ");
  1561.          WriteInt(Rang,3);
  1562.          printf("   ");
  1563.          if (AreaUpNode->node.ln_Succ) {
  1564.             printf(&AreaUpNode->User);
  1565.  
  1566.             for (i=strlen(&AreaUpNode->User);i<15;i++)
  1567.                putchar(' ');
  1568.  
  1569.             printf("  ");
  1570.             WriteInt(AreaUpNode->Anzahl,2);
  1571.             printf("  ");
  1572.             WriteIntTausend(AreaUpNode->GesLaenge,12);
  1573.             printf("  ");
  1574.  
  1575.          }
  1576.          else {
  1577.             printf("                                   ");
  1578.          }
  1579.  
  1580.          if (AreaDownNode->node.ln_Succ) {
  1581.             printf("  ");
  1582.             printf(&AreaDownNode->User);
  1583.  
  1584.             for (i=strlen(&AreaDownNode->User);i<15;i++)
  1585.                putchar(' ');
  1586.  
  1587.             printf("  ");
  1588.             WriteInt(AreaDownNode->Anzahl,2);
  1589.             printf("  ");
  1590.             WriteIntTausend(AreaDownNode->GesLaenge,12);
  1591.  
  1592.          }
  1593.          else {
  1594.             printf("                                   ");
  1595.          }
  1596.          printf("       \n");
  1597.       }
  1598.       if (Rang==1)
  1599.          putchar('\n');
  1600.       Rang++;
  1601.  
  1602.       if (AreaUpNode->node.ln_Succ)
  1603.          AreaUpNode   = (struct AreaStatInfo*) AreaUpNode->node.ln_Succ;
  1604.  
  1605.       if (AreaDownNode->node.ln_Succ)
  1606.          AreaDownNode = (struct AreaStatInfo*) AreaDownNode->node.ln_Succ;
  1607.    }
  1608.  
  1609. }
  1610.  
  1611. static void MakeUserStatListe(char *UserName)
  1612. {
  1613.    struct LineFormat    *LineNode;
  1614.    struct UserStatInfo    *UserNode;
  1615.    struct DateStamp    AktDate;
  1616.    char            *TempString[64];
  1617.  
  1618.    DateStamp(&AktDate);
  1619.  
  1620.    /* UserStat Down Liste erstellen */
  1621.  
  1622.    LineNode = (struct LineFormat*) LineList.lh_Head;
  1623.    while (LineNode->node.ln_Succ) {
  1624.       if (LineNode->Action==LF_Dwn) {
  1625.          if ( (LineNode->Laenge) && (LineNode->Datum.ds_Days>=AktDate.ds_Days-Cfg.DaysAgo) ) {
  1626.             if (!stricmp(&LineNode->User,UserName)) {
  1627.                strcpy(&TempString,&LineNode->Name1);
  1628.                strcat(&TempString,":");
  1629.                strcat(&TempString,&LineNode->Name2);
  1630.                if (!UserInList(&TempString,&UserDownListe)) {
  1631.                   if (UserNode=AllocPooled(PoolHeader,sizeof(struct UserStatInfo))) {
  1632.                      UserNode->GesLaenge = LineNode->Laenge;
  1633.                      UserNode->Datum     = LineNode->Datum;
  1634.                      strcpy(&UserNode->File,&TempString);
  1635.                      AddTail(&UserDownListe,UserNode);
  1636.                   }
  1637.                }
  1638.             }
  1639.          }
  1640.       }
  1641.       LineNode = (struct LineFormat*) LineNode->node.ln_Succ;
  1642.    }
  1643.  
  1644.    /* UserStat Up Liste erstellen */
  1645.  
  1646.    LineNode = (struct LineFormat*) LineList.lh_Head;
  1647.    while (LineNode->node.ln_Succ) {
  1648.       if (LineNode->Action==LF_Upl) {
  1649.          if ( (LineNode->Laenge) && (LineNode->Datum.ds_Days>=AktDate.ds_Days-Cfg.DaysAgo) ) {
  1650.             if (!stricmp(&LineNode->User,UserName)) {
  1651.                strcpy(&TempString,&LineNode->Name1);
  1652.                strcat(&TempString,":");
  1653.                strcat(&TempString,&LineNode->Name2);
  1654.                if (!UserInList(&TempString,&UserUpListe)) {
  1655.                   if (UserNode=AllocPooled(PoolHeader,sizeof(struct UserStatInfo))) {
  1656.                      UserNode->GesLaenge = LineNode->Laenge;
  1657.                      UserNode->Datum     = LineNode->Datum;
  1658.                      strcpy(&UserNode->File,&TempString);
  1659.                      AddTail(&UserUpListe,UserNode);
  1660.                   }
  1661.                }
  1662.             }
  1663.          }
  1664.       }
  1665.       LineNode = (struct LineFormat*) LineNode->node.ln_Succ;
  1666.    }
  1667. }
  1668.  
  1669. static void ShowUserStat(void)
  1670. {
  1671.    struct UserStatInfo    *UserUpNode,*UserDownNode;
  1672.    int            i,GesamtLaenge=0,Rang=1;
  1673.    char            Date[16],Time[16];
  1674.  
  1675.    printf("Uploads:\n");
  1676.    UserUpNode   = (struct UserStatInfo*) UserUpListe.lh_Head;
  1677.    while (UserUpNode->node.ln_Succ) {
  1678.       if (Rang<=Cfg.TopUserStat) {
  1679.          printf(" ");
  1680.          WriteInt(Rang,3);
  1681.          printf(" ");
  1682.          printf(&UserUpNode->File);
  1683.  
  1684.          for (i=strlen(&UserUpNode->File);i<40;i++)
  1685.             putchar(' ');
  1686.  
  1687.          printf(" ");
  1688.          WriteIntTausend(UserUpNode->GesLaenge,12);
  1689.  
  1690.          GesamtLaenge += UserUpNode->GesLaenge;
  1691.  
  1692.          DecodeDate(&Date,&Time,&UserUpNode->Datum);
  1693.          printf("   %s %s\n",&Date,&Time);
  1694.       }
  1695.       Rang++;
  1696.  
  1697.       UserUpNode = (struct UserStatInfo*) UserUpNode->node.ln_Succ;
  1698.  
  1699.    }
  1700.  
  1701.    if (GesamtLaenge>0) {
  1702.       printf("                                             --------------\n");
  1703.       printf("                                              ");
  1704.       WriteIntTausend(GesamtLaenge,12);
  1705.       printf("\n");
  1706.    }
  1707.  
  1708.    Rang=1;
  1709.    GesamtLaenge=0;
  1710.  
  1711.    printf("------------------------------------------------------------------------------\nDownloads:\n");
  1712.  
  1713.    UserDownNode   = (struct UserStatInfo*) UserDownListe.lh_Head;
  1714.    while (UserDownNode->node.ln_Succ) {
  1715.       if (Rang<=Cfg.TopUserStat) {
  1716.          printf(" ");
  1717.          WriteInt(Rang,3);
  1718.          printf(" ");
  1719.          printf(&UserDownNode->File);
  1720.  
  1721.          for (i=strlen(&UserDownNode->File);i<40;i++)
  1722.             putchar(' ');
  1723.  
  1724.          printf(" ");
  1725.          WriteIntTausend(UserDownNode->GesLaenge,12);
  1726.  
  1727.          GesamtLaenge += UserDownNode->GesLaenge;
  1728.  
  1729.          DecodeDate(&Date,&Time,&UserDownNode->Datum);
  1730.          printf("   %s %s\n",&Date,&Time);
  1731.       }
  1732.       Rang++;
  1733.  
  1734.       UserDownNode = (struct UserStatInfo*) UserDownNode->node.ln_Succ;
  1735.  
  1736.    }
  1737.  
  1738.    if (GesamtLaenge>0) {
  1739.       printf("                                             --------------\n");
  1740.       printf("                                              ");
  1741.       WriteIntTausend(GesamtLaenge,12);
  1742.       printf("\n");
  1743.    }
  1744.  
  1745. }
  1746.  
  1747. static void WriteInt(int Zahl, int Stellen)
  1748. {
  1749.    char        TempString[16];
  1750.    int        Laenge,i;
  1751.  
  1752.    Laenge=stci_d(&TempString,Zahl);
  1753.    if (Laenge<Stellen) {
  1754.       for (i=Laenge;i<Stellen;i++)
  1755.          putchar(' ');
  1756.  
  1757.    }
  1758.    printf(&TempString);
  1759. }
  1760.  
  1761. static void WriteIntTausend(int Zahl, int Stellen)
  1762. {
  1763.    char        TempString[32],ResultString[32];
  1764.    int        Laenge,i,t;
  1765.    char        *S;
  1766.  
  1767.    S=&TempString[0];
  1768.  
  1769.    Laenge=stci_d(&TempString,Zahl);
  1770.  
  1771.    while (*S!=0)
  1772.       S++;
  1773.  
  1774.    i=1;
  1775.  
  1776.    do {
  1777.       S--;
  1778.       if ( (i==4) || (i==8) || (i==12) || (i==15) ) {
  1779.          ResultString[i-1]='.';
  1780.          i++;
  1781.          Laenge++;
  1782.       }
  1783.       ResultString[i-1]=*S;
  1784.       i++;
  1785.    } while (S!=&TempString[0]);
  1786.  
  1787.    if (Laenge<Stellen) {
  1788.       Laenge=Stellen-Laenge;
  1789.       for (t=0;t<Laenge;t++) {
  1790.          ResultString[i-1]=' ';
  1791.          i++;
  1792.       }
  1793.    }
  1794.  
  1795.    ResultString[i-1]=0;
  1796.    strrev(&ResultString);
  1797.    printf(&ResultString);
  1798. }
  1799.  
  1800. static BOOL CheckAllowed(void)
  1801. {
  1802.    struct HiddenData    *UserNode;
  1803.    BOOL            ReturnCode=FALSE;
  1804.    char            User[15];
  1805.  
  1806.    if (GetVar("EazyUsername",&User,15,0)==-1)
  1807.       return TRUE;
  1808.  
  1809.    if (!Cfg.AllowedUser) {
  1810.       ReturnCode=TRUE;
  1811.    }
  1812.    else {
  1813.       UserNode = (struct HiddenData*) Cfg.AllowedUser->lh_Head;
  1814.       while (UserNode->node.ln_Succ) {
  1815.          if (!stricmp(&UserNode->String,&User))
  1816.             ReturnCode=TRUE;
  1817.          if (!strcmp(&UserNode->String,"*"))
  1818.             ReturnCode=TRUE;
  1819.          UserNode = (struct HiddenData*) UserNode->node.ln_Succ;
  1820.       }
  1821.    }
  1822.  
  1823.    if (Cfg.ForbiddenUser) {
  1824.       UserNode = (struct HiddenData*) Cfg.ForbiddenUser->lh_Head;
  1825.       while (UserNode->node.ln_Succ) {
  1826.          if (!stricmp(&UserNode->String,&User))
  1827.             ReturnCode=FALSE;
  1828.          UserNode = (struct HiddenData*) UserNode->node.ln_Succ;
  1829.       }
  1830.    }
  1831.    return ReturnCode;
  1832. }
  1833.